//
//  QGComposeTextView.swift
//  斯威夫特微博
//
//  Created by youyoumacmini3 on 2017/8/11.
//  Copyright © 2017年 youyoumacmini3. All rights reserved.
//

import UIKit


/// 撰写微博文本视图
class QGComposeTextView: UITextView {

    
    /// 占位标签
    fileprivate lazy var placeHolderLabel = UILabel()
    
    override func awakeFromNib() {
        setUI()
    }
    
    deinit {
        // 注销通知
        NotificationCenter.default.removeObserver(self)
    }
    
    //MARK: - 监听方法
    @objc fileprivate func textChanged() {
        // 如果有文本 ，不显示占位标签，否则显示
        placeHolderLabel.isHidden = self.hasText// 一个协议方法(头文件中找)
    }

}

// MARK: - 表情键盘专属方法
extension QGComposeTextView {
    
    
    // 返回 textView 对应纯文本的字符串[将属性图片转换成文字]
    var emotionText: String {
        
        // 1. 获取textView 属性文本
        guard let attrStr = attributedText else {
            return ""
        }
        
        // 2. 需要获得属性文本中的图片【附件： Attachment】
        /*
         1. 遍历的范围
         2. 选项 []
         3. 闭包
         */
        var result = String()
        attrStr.enumerateAttributes(in: NSRange(location: 0, length: attrStr.length), options: [], using: { (dic, range, _) in

            // 如果字典中包含 NSAttachment 的 ‘key’ ,说明是图片，否则是文本
            // 下一个目标，从 attachament 中如果能够获得chs 就可以了
            if let attachment = dic["NSAttachment"] as? CZEmotionAttachment {
                //print("图片\(attachament)")
                result += attachment.chs ?? ""
                
            }else{
                let subStr = (attrStr.string as NSString).substring(with: range)
                result += subStr
            }
        })
        return result
    }
    
    
    /// 向文本视图插入表情符号[图文混排]
    ///
    /// - Parameter em: 选中的表情符号，nil 表示删除
    func insertEmotion(em: CZEmotion?) {
        
        // 1. em == nil 是删除按钮
        guard let em = em else {
            
            // 删除文本
            deleteBackward()
            
            return
        }
        // 2. emoji 字符串
        if let emoji = em.emoji,
            let textRange = selectedTextRange{
            
            // UITextRange 仅用在此处
            replace(textRange, withText: emoji)
            
        }
        
        // 代码执行到此，都是图片
        // 0> 获取表情中的图像属性文本
        // 所有排版系统中，几乎都有一个共同特点，插入字符的显示，跟随前一个字符的属性，但本身没有‘属性’
        //        let imageText = NSMutableAttributedString(attributedString: em.imageText(font: textView.font!))
        //        // 设置图像文字属性
        //        imageText.addAttributes([NSFontAttributeName: textView.font!], range: NSRange(location: 0, length: 1))
        
        let imageText = em.imageText(font: font!)
        
        
        // 1> 获取当前 textView 属性文本 => 可变的
        let attrStrM = NSMutableAttributedString(attributedString: attributedText)
        
        // 2> 将图像的属性文本插入到当前的光标位置
        attrStrM.replaceCharacters(in: selectedRange, with: imageText)
        
        // 3> 重新设置属性文本
        // 记录光标位置
        let range = selectedRange
        
        // 设置文本
        attributedText = attrStrM
        
        // 恢复光标位置, length是选中字符的长度，插入文本之后，应该为0
        selectedRange = NSRange(location: range.location + 1, length: 0)
        
        // 4> 让代理执行文本变化方法 - 在需要的时候通知代理执行协议方法
        delegate?.textViewDidChange?(self)
        
        // 5> 执行当前对象的文本变化方法
        textChanged()
    }

}


private extension QGComposeTextView {
    func setUI() {
        
        // 0. 
        // 注册通知 - 通知是一对多，如果其他控件监听当前文本视图的通知，不会影响
        // 但是如果使用代理，其他控件就无法使用代理监听通知
        NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: Notification.Name.UITextViewTextDidChange, object: self)
        
        // 1. 设置占位标签
        placeHolderLabel.text = "分享新鲜事..."
        placeHolderLabel.font = self.font
        placeHolderLabel.textColor = UIColor.lightGray
        placeHolderLabel.frame.origin = CGPoint(x: 5, y: 8)
        placeHolderLabel.sizeToFit()
        
        addSubview(placeHolderLabel)
        
    }
}
